package com.kedacom.demo.healthcheck;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 健康检查单项
 * @author luocanfeng
 * @date 2016年9月2日
 */
public abstract class HealthCheckItem {

	protected String name; // 检查内容
	protected Type type; // 检查项类型
	protected int retry = 1; // 健康检查失败重试次数
	protected int retryInterval = 1; // 健康检查失败重试间隔时间，单位秒

	private Logger logger = LoggerFactory.getLogger(getClass());

	public static enum Type {
		MySQL, Memcache, GlusterFS, Redis, RabbitMQ
	}

	/**
	 * 执行该检查项的健康检查
	 */
	public boolean check() {
		logger.debug("{} start", name);
		boolean check = doCheck();
		if (!check && retry > 0) {
			for (int i = retry; i > 0; i--) {
				if (doCheck()) {
					return true;
				}
			}
		}
		logger.debug("{} end, {}", name, check ? HealthCheck.STATUS_OK : HealthCheck.STATUS_ERR);
		return check;
	}

	/**
	 * 实际执行健康检查的业务逻辑
	 */
	public abstract boolean doCheck();

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Type getType() {
		return type;
	}

}
